// let count = 0;

// let arr = parseInt;//保存原函数

// window.parseInt=function(){
//     count += 2;
//     return arr.apply(null,arguments);//调用原函数
// }

// parseInt('20')

// console.log(count);//结果：1

'use strict0'
//定义类
class Point{
    constructor(x,y){
        this.x=x;
        this.y=y;
    }
    toString(){
        return '(' + this.x + ', ' + this.y + ')'
    }
}
var lisa = new Point();
console.log(lisa.toString());

// class Point{
//     //...
// }
// typeof Point//function
// Point === Point.prototype.constructor//true;

// class Bar{
//     doStuff(){
//         console.log('stuff');//stuff
//     }
// }
// var b = new Bar();
// console.log(b.doStuff());//undefined

//Class表达式


//这个类的名字MyClass而不是Me，Me只在Class的内部代码可用，指代当前类。
const MyClass = class Me{
    getClassName(){
        return Me.name;//Me只在Class内部定义。
    }
}
let inst = new MyClass();
console.log(inst.getClassName());//Me
//console.log(Me.name); // ReferenceError: Me is not defined

//如果类的内部没用到的话，可以省略Me，也就是可以写成下面的形式。
//const MyClass = class{};

//采用Class表达式，可以写出立即执行的Class。
let person = new class{//person是一个立即执行的类实例
    constructor(name){
        this.name = name;
    }
    sayName(){
        console.log(this.name);//张三
    }
}('张三');
console.log(person.sayName());//undefined

//this指向
//类的方法内容如果含有this，他默认指向类的实例。
//但是，必须非常小心，一旦单独使用该方法，很可能报错
// class Logger{
//     printName(name='three'){
//         this.print(`Hellow ${name}`);
//     }
//     print(text){
//         console.log(text);
//     }
// }
// const logger = new Logger();
// const {printName} = logger;
// //printName();
// console.log(printName());
//class继承
//class 可以通过extends关键字实现继承，这比ES5的通过修改原型链实现继承，要清晰和方便很多。

//class Point{}
//class ColorPoint extends Point{}
//定义了一个ColorPoint类，该类通过extends关键字，继承了Point类的所有属性和方法。
//但是由于没有部署任何代码，所以这两个类完全一样，等于复制了一个Point类。下面，我们在ColorPoint内部加上代码。

//请利用class重新定义Cat，并让它从已有的Animal继承，然后新增一个方法say()，返回字符串'Hello, xxx!'：
class Animal {
    constructor(name) {
        this.name = name;
    }
}

class Cat extends Animal{
    constructor(name){
        super(name);
    }
    say(){
        return 'Hello, '+this.name+'!';
    }

}

// 测试:
var kitty = new Cat('Kitty');
var doraemon = new Cat('哆啦A梦');
if ((new Cat('x') instanceof Animal) && kitty && kitty.name === 'Kitty' && kitty.say && typeof kitty.say === 'function' && kitty.say() === 'Hello, Kitty!' && kitty.say === doraemon.say) {
    alert('测试通过!');
} else {
    alert('测试失败!');
}


//请利用构造函数定义Cat，并让所有的Cat对象有一个name属性，并共享一个方法say()，返回字符串’Hello, xxx!’：
// function Cat(name) {
//     //
//     this.name=name;
// };
// Cat.prototype.say=function(){
//     return 'Hello, '+this.name+'!';
// }

// // 测试:
// var kitty = new Cat('Kitty');
// var doraemon = new Cat('哆啦A梦');
// if (kitty && kitty.name === 'Kitty' && kitty.say && typeof kitty.say === 'function' && kitty.say() === 'Hello, Kitty!' && kitty.say === doraemon.say) {
//     alert('测试通过!');
// } else {
//     alert('测试失败!');
// }